package com.xiongwei.collection;

import java.util.*;

/**
 * List是按索引顺序访问的长度可变的有序表，优先使用ArrayList(数组)而不是LinkedList(链表)；
 *
 * 可以直接使用for each遍历List；
 *
 * List可以和Array相互转换。
 *
 * @author XiongWei
 * @date 2021/1/6
 */
public class ListUse {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("pear");
        //list允许添加重复元素
        list.add("apple");
        //list允许添加null
        list.add(null);
        System.out.println(list.size());

        //推荐使用Iterator来访问list
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String next = it.next();
            System.out.println(next);
        }
        //for each循环本身就是使用interator便利
        for (String s : list) {
            System.out.println(s);
        }

        ListUse lu = new ListUse();

        System.out.println("=======================================");
        System.out.println(lu.quickCreate());

        System.out.println("=======================================");

        lu.ListToArray();

    }

    /**
     * ArrayList把增加和删除的操作封装起来,让我们操作List类似于操作数组,不用关心元素如何移动
     * 末尾添加: boolean add(E e)
     * 指定索引添加: boolean add(int index, E e)
     * 删除指定索引的元素: int remove(int index)
     * 删除某个元素: int remove(object o)
     * 获取指定索引的元素: E get(int index)
     * 获取链表大小: int size()
     * 判断List是否包含某个特定元素: boolean contains(Object o)
     * 返回某个元素的索引: int indexOf(Object o)
     */

    /**
     * 快速创建List:of() (JDK11才有,of方法不接受null)
     */
    public List quickCreate() {
        List<Integer> list = List.of(1,2,5);
        return list;
    }

    /**
     * List->Array有三种方法:
     *  1.toArray():会丢失类型信息
     *  2.toArray(T[]):<T>并不是List接口定义的泛型参数<E>,所以可传入其他类型的数组,
     *                 但是传入类型不匹配的数组会抛出ArrayStoreException
     *  3.通过List定义的T[] toArray(IntFunction<T[]> generator)
     */
    public void ListToArray() {
        List<String> list = new ArrayList<>();
        list.add("kobe");
        list.add("james");
        Object[] objects = list.toArray();
        for (Object object : objects) {
            System.out.println(object);
        }

        List<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        Number[] numbers = list2.toArray(new Number[list2.size()]);
        for (Number number : numbers) {
            System.out.println(number);
        }

        List<Integer> list3 = new ArrayList<>();
        Integer[] array = list3.toArray(Integer[]::new);
    }

    /**
     * 1.List.of(T..):返回的是一个只读list
     * 2.Arrays.asList(T..)
     */
    public void ArrayToList() {
        List<Integer> list = List.of(12,33,22);
        //UnsupportedOperationException
        //list.add(11);
        List<Integer> integers = Arrays.asList(1, 2, 3);
    }

}
